home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Entertainment / MacMud / Sockets / tcpglue.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-15  |  7.2 KB  |  378 lines  |  [TEXT/MPS ]

  1. /*
  2.  *    Glue routines to call the MacTCP drivers
  3.  *    
  4.  *    Summer 1989, Tom Milligan, University of Toronto Computing Services
  5.  */
  6.  
  7.      
  8. #include <memory.h>
  9. #include <devices.h>
  10. #include <files.h>
  11. #include <errors.h>
  12.  
  13. #include "tcpglue.h"
  14.  
  15. static short driver = 0;
  16.  
  17. /*
  18.  * create a TCP stream
  19.  */
  20. OSErr xTCPCreate(buflen,notify,pb) 
  21.     int buflen;
  22.     TCPNotifyProc notify;
  23.     TCPiopb *pb;
  24. {    
  25.     OSErr io;
  26.     
  27.     xOpenDriver(driver,io);
  28.         
  29.     pb->ioCRefNum = driver;
  30.     pb->csCode = TCPCreate;
  31.     pb->csParam.create.rcvBuff = NewPtr(buflen);
  32.     pb->csParam.create.rcvBuffLen = buflen;
  33.     pb->csParam.create.notifyProc = notify;
  34.     xPBControlSync(pb,io);
  35.     return(io);
  36. }
  37.  
  38. /*
  39.  * start listening for a TCP connection
  40.  */
  41. OSErr xTCPPassiveOpen(pb,port,completion) 
  42.     TCPiopb *pb; 
  43.     short port;
  44.     TCPIOCompletionProc completion;
  45. {
  46.     if (driver == 0)
  47.         return(invalidStreamPtr);
  48.  
  49.     pb->ioCRefNum = driver;
  50.     pb->csCode = TCPPassiveOpen;
  51.     pb->csParam.open.validityFlags = timeoutValue | timeoutAction;
  52.     pb->csParam.open.ulpTimeoutValue = 60 /* seconds */;
  53.     pb->csParam.open.ulpTimeoutAction = 1 /* 1:abort 0:report */;
  54.     pb->csParam.open.commandTimeoutValue = 0 /* infinity */;
  55.     pb->csParam.open.remoteHost = 0;
  56.     pb->csParam.open.remotePort = 0;
  57.     pb->csParam.open.localHost = 0;
  58.     pb->csParam.open.localPort = port;
  59.     pb->csParam.open.dontFrag = 0;
  60.     pb->csParam.open.timeToLive = 0;
  61.     pb->csParam.open.security = 0;
  62.     pb->csParam.open.optionCnt = 0;
  63.     xPBControl(pb,completion);
  64. }
  65.  
  66. /*
  67.  * connect to a remote TCP
  68.  */
  69. OSErr xTCPActiveOpen(pb,port,rhost,rport,completion) 
  70.     TCPiopb *pb; 
  71.     short port;
  72.     long rhost;
  73.     short rport;
  74.     TCPIOCompletionProc completion;
  75. {
  76.     if (driver == 0)
  77.         return(invalidStreamPtr);
  78.  
  79.     pb->ioCRefNum = driver;
  80.     pb->csCode = TCPActiveOpen;
  81.     pb->csParam.open.validityFlags = timeoutValue | timeoutAction;
  82.     pb->csParam.open.ulpTimeoutValue = 60 /* seconds */;
  83.     pb->csParam.open.ulpTimeoutAction = 1 /* 1:abort 0:report */;
  84.     pb->csParam.open.commandTimeoutValue = 0;
  85.     pb->csParam.open.remoteHost = rhost;
  86.     pb->csParam.open.remotePort = rport;
  87.     pb->csParam.open.localHost = 0;
  88.     pb->csParam.open.localPort = port;
  89.     pb->csParam.open.dontFrag = 0;
  90.     pb->csParam.open.timeToLive = 0;
  91.     pb->csParam.open.security = 0;
  92.     pb->csParam.open.optionCnt = 0;
  93.     xPBControl(pb,completion);
  94. }
  95.  
  96. /*
  97.  * ask for incoming data
  98.  */
  99. OSErr xTCPRcv(pb,buf,buflen,completion) 
  100.     TCPiopb *pb;
  101.     Ptr buf; 
  102.     int buflen;
  103.     TCPIOCompletionProc completion;
  104. {
  105.     if (driver == 0)
  106.         return(invalidStreamPtr);
  107.     
  108.     pb->ioCRefNum = driver;
  109.     pb->csCode = TCPRcv;
  110.     pb->csParam.receive.commandTimeoutValue = 0 /* infinity */;
  111.     pb->csParam.receive.rcvBuff = buf;
  112.     pb->csParam.receive.rcvBuffLen = buflen;
  113.     xPBControl(pb,completion);
  114. }
  115.  
  116. /*
  117.  * send data
  118.  */
  119. OSErr xTCPSend(pb,wds,push,urgent,completion) 
  120.     TCPiopb *pb;
  121.     wdsEntry *wds; 
  122.     Boolean push;
  123.     Boolean urgent;
  124.     TCPIOCompletionProc completion;
  125. {
  126.     if (driver == 0)
  127.         return(invalidStreamPtr);
  128.     
  129.     pb->ioCRefNum = driver;
  130.     pb->csCode = TCPSend;
  131.     pb->csParam.send.validityFlags = timeoutValue | timeoutAction;
  132.     pb->csParam.send.ulpTimeoutValue = 60 /* seconds */;
  133.     pb->csParam.send.ulpTimeoutAction = 1 /* 1:abort 0:report */;
  134.     pb->csParam.send.pushFlag = push;
  135.     pb->csParam.send.urgentFlag = urgent;
  136.     pb->csParam.send.wdsPtr = (Ptr)wds;
  137.     xPBControl(pb,completion);
  138. }
  139.  
  140. /*
  141.  * close a connection
  142.  */
  143. OSErr xTCPClose(pb,completion) 
  144.     TCPiopb *pb;
  145.     TCPIOCompletionProc completion;
  146. {
  147.     if (driver == 0)
  148.         return(invalidStreamPtr);
  149.     
  150.     pb->ioCRefNum = driver;
  151.     pb->csCode = TCPClose;
  152.     pb->csParam.close.validityFlags = timeoutValue | timeoutAction;
  153.     pb->csParam.close.ulpTimeoutValue = 60 /* seconds */;
  154.     pb->csParam.close.ulpTimeoutAction = 1 /* 1:abort 0:report */;
  155.     xPBControl(pb,completion);
  156. }
  157.  
  158. /*
  159.  * abort a connection
  160.  */
  161. OSErr xTCPAbort(pb) 
  162.     TCPiopb *pb;
  163. {
  164.     OSErr io;
  165.     
  166.     if (driver == 0)
  167.         return(invalidStreamPtr);
  168.     
  169.     pb->ioCRefNum = driver;
  170.     pb->csCode = TCPAbort;
  171.     xPBControlSync(pb,io);
  172.     return(io);
  173. }
  174.  
  175. /*
  176.  * close down a TCP stream (aborting a connection, if necessary)
  177.  */
  178. OSErr xTCPRelease(pb) 
  179.     TCPiopb *pb;
  180. {
  181.     OSErr io;
  182.     
  183.     if (driver == 0)
  184.         return(invalidStreamPtr);
  185.     
  186.     pb->ioCRefNum = driver;
  187.     pb->csCode = TCPRelease;
  188.     xPBControlSync(pb,io);
  189.     if (io == noErr)
  190.         DisposPtr(pb->csParam.create.rcvBuff); /* there is no release pb */
  191.     return(io);
  192. }
  193.  
  194. int
  195. xTCPBytesUnread(pb) 
  196.     TCPiopb *pb;
  197. {
  198.     OSErr io;
  199.     
  200.     if (driver == 0)
  201.         return(-1);
  202.     
  203.     pb->ioCRefNum = driver;
  204.     pb->csCode = TCPStatus;
  205.     xPBControlSync(pb,io);
  206.     if (io != noErr)
  207.         return(-1);
  208.     return(pb->csParam.status.amtUnreadData);
  209. }
  210.  
  211.  
  212. int
  213. xTCPState(pb) 
  214.     TCPiopb *pb;
  215. {
  216.     OSErr io;
  217.     
  218.     if (driver == 0)
  219.         return(-1);
  220.     
  221.     pb->ioCRefNum = driver;
  222.     pb->csCode = TCPStatus;
  223.     xPBControlSync(pb,io);
  224.     if (io != noErr)
  225.         return(-1);
  226.     return(pb->csParam.status.connectionState);
  227. }
  228.  
  229.  
  230. /*
  231.  * create a UDP stream
  232.  */
  233. OSErr xUDPCreate(buflen,notify,port,pb) 
  234.     int buflen;
  235.     UDPNotifyProc notify;
  236.     ip_port port;
  237.     UDPiopb *pb;
  238. {    
  239.     OSErr io;
  240.     
  241.     xOpenDriver(driver,io);
  242.         
  243.     pb->ioCRefNum = driver;
  244.     pb->csCode = UDPCreate;
  245.     pb->csParam.create.rcvBuff = NewPtr(buflen);
  246.     pb->csParam.create.rcvBuffLen = buflen;
  247.     pb->csParam.create.notifyProc = notify;
  248.     pb->csParam.create.localPort = port;
  249.     xPBControlSync(pb,io);
  250.     return(io);
  251. }
  252.  
  253. /*
  254.  * ask for incoming data
  255.  */
  256. OSErr xUDPRead(pb,completion) 
  257.     UDPiopb *pb;
  258.     UDPIOCompletionProc completion;
  259. {
  260.     if (driver == 0)
  261.         return(invalidStreamPtr);
  262.     
  263.     pb->ioCRefNum = driver;
  264.     pb->csCode = UDPRead;
  265.     pb->csParam.receive.timeOut = 0 /* infinity */;
  266.     pb->csParam.receive.secondTimeStamp = 0/* must be zero */;
  267.     xPBControl(pb,completion);
  268. }
  269.  
  270. OSErr xUDPBfrReturn(pb) 
  271.     UDPiopb *pb;
  272. {
  273.     OSErr io;
  274.     
  275.     if (driver == 0)
  276.         return(invalidStreamPtr);
  277.     
  278.     pb->ioCRefNum = driver;
  279.     pb->csCode = UDPBfrReturn;
  280.     /* rcvBuff is still there from the read */
  281.     xPBControlSync(pb,io);
  282.     return(io);
  283. }
  284.  
  285. /*
  286.  * send data
  287.  */
  288. OSErr xUDPWrite(pb,host,port,wds,completion) 
  289.     UDPiopb *pb;
  290.     ip_addr host;
  291.     ip_port port;
  292.     Ptr wds; 
  293.     UDPIOCompletionProc completion;
  294. {
  295.     if (driver == 0)
  296.         return(invalidStreamPtr);
  297.     
  298.     pb->ioCRefNum = driver;
  299.     pb->csCode = UDPWrite;
  300.     pb->csParam.send.remoteHost = host;
  301.     pb->csParam.send.remotePort = port;
  302.     pb->csParam.send.wdsPtr = wds;
  303.     pb->csParam.send.checkSum = true;
  304.     pb->csParam.send.sendLength = 0/* must be zero */;
  305.     xPBControl(pb,completion);
  306. }
  307.  
  308. /*
  309.  * close down a UDP stream (aborting a read, if necessary)
  310.  */
  311. OSErr xUDPRelease(pb) 
  312.     UDPiopb *pb;
  313. {
  314.     OSErr io;
  315.     
  316.     if (driver == 0)
  317.         return(invalidStreamPtr);
  318.     
  319.     pb->ioCRefNum = driver;
  320.     pb->csCode = UDPRelease;
  321.     xPBControlSync(pb,io);
  322.     if (io == noErr)
  323.     {
  324.         /* there is no release pb, so I'm using create because */
  325.         /* the buffer pointer is in the right place */
  326.         DisposPtr(pb->csParam.create.rcvBuff);
  327.     }
  328.     return(io);
  329. }
  330.  
  331. ip_addr xIPAddr() 
  332. {
  333.     struct IPParamBlock pbrec, *pb = &pbrec;
  334.     OSErr io;
  335.     
  336.     xOpenDriver(driver,0);
  337.  
  338.     pb->ioCRefNum = driver;
  339.     pb->csCode = ipctlGetAddr;
  340.     xPBControlSync(pb,io);
  341.     if (io != noErr)
  342.         return(0);
  343.     return(pb->ourAddress);
  344. }
  345.  
  346. long xNetMask() 
  347. {
  348.     struct IPParamBlock pbrec, *pb = &pbrec;
  349.     OSErr io;
  350.     
  351.     xOpenDriver(driver,0);
  352.         
  353.     pb->ioCRefNum = driver;
  354.     pb->csCode = ipctlGetAddr;
  355.     xPBControlSync(pb,io);
  356.     if (io != noErr)
  357.         return(0);
  358.     return(pb->ourNetMask);
  359. }
  360.  
  361. unsigned short xMaxMTU()
  362. {
  363.     struct UDPiopb pbrec, *pb = &pbrec;
  364.     OSErr io;
  365.     
  366.     xOpenDriver(driver,0);
  367.  
  368.     pb->ioCRefNum = driver;
  369.     pb->csCode = UDPMaxMTUSize;
  370.     pb->csParam.mtu.remoteHost = xIPAddr();
  371.     xPBControlSync(pb,io);
  372.     if (io != noErr)
  373.         return(0);
  374.     return(pb->csParam.mtu.mtuSize);
  375. }
  376.  
  377.  
  378.